package com.micro.plugins.mapper.handler;

import org.apache.ibatis.executor.result.ResultMapException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @desc mybatis查询返回list数组
 * @author LevelCoder
 * @version V1.0.0
 * @email LevelCoder@126.com
 * @date 2019/8/9
 */
@MappedTypes(List.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class TypeStringListHandler extends BaseTypeHandler<List<String>> {

    /**
     * 重写getResult 针对null进行空数组处理
     * @param rs
     * @param columnName
     * @return
     * @throws SQLException
     */
    @Override
    public List<String> getResult(ResultSet rs, String columnName) throws SQLException {
        List<String> result;
        try {
            result = getNullableResult(rs, columnName);
        } catch (Exception e) {
            throw new ResultMapException("Error attempting to get column '" + columnName + "' from result set.  Cause: " + e, e);
        }
        if (rs.wasNull()) {
            return new ArrayList<String>();
        } else {
            return result;
        }
    }



    /**
     * @desc 把Java类型参数转换为对应的数据库类型
     * @param ps            当前的PreparedStatement对象
     * @param i             当前参数位置
     * @param parameter     当前参数的Java对象
     * @param jdbcType      当前参数的数据库类型
     * @throws SQLException 异常为SQLException
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
        //1.List集合转字符串
        StringBuffer sb = new StringBuffer();
        for (String string : parameter) {
            sb.append(string).append(",");
        }
        //2.设置给ps
        ps.setString(i, sb.toString().substring(0, sb.toString().length() - 1));
    }

    /**
     * @desc 获取数据结果集时把数据库类型转换为对应的Java类型
     * @param rs            当前的结果集
     * @param columnName    当前的字段名称
     * @return              转换后的Java对象
     * @throws SQLException 异常为SQLException
     */
    @Override
    public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return checkArray(rs.getString(columnName));
    }

    /**
     * @desc 通过字段位置获取字段数据时把数据库类型转换为对应的Java类型
     * @param rs             当前的结果集
     * @param columnIndex    当前字段的位置
     * @return               转换后的Java对象
     * @throws SQLException  异常为SQLException
     */
    @Override
    public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return checkArray(rs.getString(columnIndex));
    }

    /**
     *
     * @param cs
     * @param columnIndex
     * @return
     * @throws SQLException
     */
    @Override
    public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return checkArray(cs.getString(columnIndex));
    }

    private List<String> checkArray(String columnValue) {
        List<String> list = new ArrayList<String>();
        if(columnValue != null){
            String array[] = columnValue.split(",");
            for(int i= 0; i < array.length ; i ++){
                if(array[i] != null && array[i].length() != 0){
                    list.add(array[i]);
                }
            }
        }
        return list;
    }

}
